/*
 * dsmGestorToken.cpp
 *
 *  Created on: Dec 15, 2013
 *      Author: m
 */

#include "DSMComun.h"
#include "SharedMemory2.h"
#include "MessageQueue.h"
#include "ColaRemotaTransmisor.h"
#include "ColaRemotaReceptor.h"
#include "CPrinter.h"
#include "StringUtils.h"

/*
 * Esto es solo para el test!!
 */

using ipc::MessageQueue;
using ipc::CPrinter;
using ipc::SharedMemory2;

int main ( int argc, char* argv[] )
{
    MessageQueue<TokenDSM> colaEntradaToken =
            MessageQueue<TokenDSM>::get( DSM_IPC_BASEFILE, COLA_ENTREGA_TOKEN );
    MessageQueue<TokenDSM> colaSalidaToken =
            MessageQueue<TokenDSM>::get( DSM_IPC_BASEFILE, COLA_LIBERAR_TOKEN );

    CPrinter::setHeader( "dsmGestorToken 1" );

    // Inicializo el token (solo para un broker!)
    ContadorDistribuido shm;
    shm.valor = 10;

    TokenDSM token;
    token.idDSM = DSMID_TEST;
    memcpy( token.data, &shm, sizeof(ContadorDistribuido) );

    while ( true )
    {
        // Simulo la llegada del token desde el anillo
        int sleepTime = random() % 10 + 5;

        CPrinter::printOut( "Esperando el token: %ds", sleepTime );
        sleep( sleepTime );

        CPrinter::printOut( "Llego el token %d desde el anillo", token.idDSM );
        CPrinter::printOut( "Enviando el token a los agentes" );
        colaEntradaToken.put( DSMID_TEST, token );
        token = colaSalidaToken.get( DSMID_TEST );
        CPrinter::printOut( "Devolviendo el token al anillo" );
    }

    return 0;
}
